/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;


import co.com.sed.model.beans.EvalEVCIndi;
import co.com.sed.model.beans.EvaluacionEVC;
import co.com.sed.model.beans.Funcionario;
import co.com.sed.model.beans.MostrarTabla;
import co.com.sed.model.datamanagers.DataManager;
import co.com.sed.model.util.Util;

/**
 * @author MBarros
 *
 */
public abstract class EvalEvcIndiPeer {
	
	private static final String BUSCAR_EVALESEVCINDI =
			"SELECT id_eval_evc_indiv, resultado_ind, evaluador, evaluacion_evc,  "+
			"observacion, fecha_desarrollo, estado "+
			"FROM eval_evc_indiv ";
	
	private static final String BUSCAR_EVALESEVCINDI_POR_FUNCIONARIO =
			"SELECT id_eval_evc_indiv, resultado_ind, evaluador, evaluacion_evc,  "+
			"observacion, fecha_desarrollo, estado "+
			"FROM eval_evc_indiv  "+
			"WHERE evaluador = &evaluador";
	
	private static final String BUSCAR_EVALEVCINDI =
			"SELECT id_eval_evc_indiv, resultado_ind, evaluador, evaluacion_evc,  "+
			"observacion, fecha_desarrollo, estado "+
			"FROM eval_evc_indiv  "+
			"WHERE id_eval_evc_indiv = &id_eval_evc_indiv";
	
	private static final String BUSCAR_EVALUADORESEVCINDI = "SELECT id_eval_evc_indiv, resultado_ind, evaluacion_evc, evaluador, "
		+ "fecha_desarrollo, estado, observacion "
		+ "FROM eval_evc_indiv WHERE evaluador IN (SELECT evaluador FROM evaluacion_evc "
		+ "WHERE (evaluacion_evc.evaluado = &idRegistroEvalEVCIndi) AND (eval_evc_indiv.evaluacion_evc  = evaluacion_evc.id_evaluacion_evc ))";

	
	private static final String BUSCAR_EVALExCINDI_DUPLICADOS = "SELECT eval_evc_indiv.id_eval_evc_indiv, evaluacion_evc.evaluado, eval_evc_indiv.evaluador, "
		+ "Extract(Year from eval_evc_indiv.fecha_desarrollo), evaluacion_evc.periodo_evaluado FROM eval_evc_indiv, evaluacion_evc "
		+ "WHERE eval_evc_indiv.evaluador = &id_Evaluador AND evaluacion_evc.evaluado = &id_idEvaluado AND evaluacion_evc.periodo_evaluado = &id_periodo AND "
		+ "Extract(Year from evaluacion_evc.fecha_asig) = &id_anio AND exists (select eval_evc_indiv.evaluacion_evc FROM evaluacion_evc, "
		+ "eval_evc_indiv WHERE eval_evc_indiv.evaluacion_evc = evaluacion_evc.id_evaluacion_evc ) GROUP BY eval_evc_indiv.id_eval_evc_indiv, evaluacion_evc.evaluado, "
		+ "eval_evc_indiv.evaluador, Extract(Year from eval_evc_indiv.fecha_desarrollo), evaluacion_evc.periodo_evaluado";
	
	
	private static final String INSERTAR_EVALEVCINDI = "INSERT INTO eval_evc_indiv(resultado_ind, evaluador, evaluacion_evc, " +
			"observacion,  fecha_desarrollo, estado) VALUES "+
			"(&resultado_ind, &evaluador, &evaluacion_evc, '&observacion', " +
			"'&fecha_desarrollo', '&estado')";
	
	private static final String ACTUALIZAR_EVALEVCINDI =
			"UPDATE eval_EVC_Indiv "+
			"SET resultado_Ind = &resultado_Ind, pregunta_EVC = '&pregunta_EVC', evaluador = &evaluador, " +
			"evaluacion_EVC = &evaluacion_EVC, observacion = '&observacion', fecha_desarrollo = '&fecha_desarrollo', estado = '&estado'"+ 
			"WHERE id_eval_evc_indiv = &id_eval_evc_indiv";
	
	private static final String ELIMINAR_EVALEVCINDI =
			"DELETE FROM eval_EVC_Indiv "+
			"WHERE id_eval_evc_indiv = &id_eval_evc_indiv";
	
		/**
		 *  busca en la base de datos todos los registros de la tabla "Eval_EVC_Indiv"
		 * 
		 * @param stmt			referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return				lista de Evales_EVC_Indiv
		 * @see         		Cargo, Statement
		 */
	
	public static ArrayList<EvalEVCIndi> buscarEvalesEVCIndi(Statement stmt, int idEvalEVCIndi) {
		ArrayList<EvalEVCIndi> EvalesEVCIndi = new ArrayList<EvalEVCIndi>();
	
		String sql = BUSCAR_EVALESEVCINDI;
	
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					EvalEVCIndi eva = new EvalEVCIndi();
					
					eva.setIdEvalEVCIndi(rs.getInt("id_eval_evc_indiv"));
					eva.setResultadoIndi(rs.getFloat("resultado_ind"));
					eva.setObservacion(rs.getString("observacion"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setFechaDesarrollo(rs.getDate("fecha_desarrollo"));
					eva.setEvaluacionEVC(new EvaluacionEVC (rs.getInt("evaluacion_evc")));
					eva.setEvaluador(new Funcionario(rs.getInt("evaluador")));	
										
					EvalesEVCIndi.add(eva);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}
	
		return EvalesEVCIndi;
	}
	
	
		/**
		 *  busca en la base de datos todos los registros de la tabla "eval_EVC_indiv" que pertenescan a un funcionario
		 * 
		 * @param stmt			referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return				lista de eval360Indi
		 * @see         		Eval360Indi, Statement
		 */
	
	public static ArrayList<EvalEVCIndi> buscarEvalesEVCPorFuncionario(Statement stmt, int evaluador) {
		ArrayList<EvalEVCIndi> evalesEVCIndi = new ArrayList<EvalEVCIndi>();
	
		String sql = BUSCAR_EVALESEVCINDI_POR_FUNCIONARIO;
		
		// se setean los "parametros"
		sql = sql.replaceAll("&evaluador", "" + evaluador);
	
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					EvalEVCIndi eva = new EvalEVCIndi();

					eva.setIdEvalEVCIndi(rs.getInt("id_eval_evc_indiv"));
					eva.setResultadoIndi(rs.getFloat("resultado_ind"));
					eva.setObservacion(rs.getString("observacion"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setFechaDesarrollo(rs.getDate("fecha_desarrollo"));
					eva.setEvaluacionEVC(new EvaluacionEVC (rs.getInt("evaluacion_evc")));
					eva.setEvaluador(new Funcionario(rs.getInt("evaluador")));	
					
										
					evalesEVCIndi.add(eva);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}
	
		return evalesEVCIndi;
	}
	
		/**
		 *  busca en la base de datos un registro de la tabla "Eval_EVC_Indiv"
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * @param Eval_EVC_Indiv		id de la Eval_EVC_Indiv que se desea cosultar
		 * 
		 * @return					cargo buscado
		 * @see         				Cargo, Statement
		 */
	
	public static EvalEVCIndi buscarEvalEVCIndi(Statement stmt, int idEvalEVCIndi) {
		EvalEVCIndi eva = new EvalEVCIndi();
	
		String sql = BUSCAR_EVALEVCINDI;
		
		// se setean los "parametros"
		sql = sql.replaceAll("&id_eval_evc_indiv", "" + idEvalEVCIndi);
		
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				if (rs.next()) {
					
					eva.setIdEvalEVCIndi(rs.getInt("id_eval_evc_indiv"));
					eva.setResultadoIndi(rs.getFloat("resultado_ind"));
					eva.setObservacion(rs.getString("observacion"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setFechaDesarrollo(rs.getDate("fecha_desarrollo"));
					eva.setEvaluacionEVC(new EvaluacionEVC (rs.getInt("evaluacion_evc")));
					eva.setEvaluador(new Funcionario(rs.getInt("evaluador")));	
												
					
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:" + e.getMessage());
			e.printStackTrace();
		}
	
		return eva;
	}
	
	// TODO ArrayList <- buscarEvaluadores360IndiTabla
	public static ArrayList<MostrarTabla> buscarEvaluadoresEVCIndiTabla(
			Statement stmt, int idEvalEVCIndi) {
		ArrayList<MostrarTabla> MostrarTabla = new ArrayList<MostrarTabla>();

		String sql = BUSCAR_EVALUADORESEVCINDI;
		sql = sql.replaceAll("&idRegistroEvalEVCIndi", "" + idEvalEVCIndi);
		Util.print("EvalEVCIndiPeer.java -> buscarEvaluadoresEVCIndi -> SQL: "
				+ sql);
		ResultSet rs;
		int i = 1;
		DataManager dm = new DataManager();
		try {
			rs = stmt.executeQuery(sql);
			try {
				Util.print("\nListando los Evaluadores del Id: "
						+ idEvalEVCIndi);
				while (rs.next()) {
					EvalEVCIndi eva = new EvalEVCIndi();

					eva.setIdEvalEVCIndi(rs.getInt("id_eval_evc_indiv"));
					eva.setResultadoIndi(rs.getFloat("resultado_ind"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setFechaDesarrollo(rs.getDate("fecha_desarrollo"));
					eva.setObservacion(rs.getString("observacion"));
					eva.setEvaluacionEVC(new EvaluacionEVC(rs
							.getInt("evaluacion_evc")));
					eva.setEvaluador(new Funcionario(rs.getInt("evaluador")));

					
					Funcionario evaluador = dm.getBuscarFuncionario(eva
							.getEvaluador().getIdFuncionario());

					MostrarTabla mostrarTabla = new MostrarTabla();
					mostrarTabla.setNum(i);
					mostrarTabla.setNombre(evaluador.getNombres());
					mostrarTabla.setApellido(evaluador.getApellidos());
					

					Util.print("\n#" + i++);
					Util.print("Nombre: " + evaluador.getNombres());
					Util.print("Apellido: " + evaluador.getApellidos());
					
					MostrarTabla.add(mostrarTabla);
				}
			} catch (Exception e) {
				Util.print("1 -> EvalEVCIndiPeer.java -> buscarEvaluadoresEVCIndi: "
						+ e.getMessage());
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("2 ->  EvalEVCIndiPeer.java -> buscarEvaluadoresEVCIndi "
					+ e.getMessage());
		}
		return MostrarTabla;
	}

	
	
	public static EvalEVCIndi buscarEvalEvcIndiDuplicados(Statement stmt,
			int idEvaluado, int periodo, int idEvaluador) {
		EvalEVCIndi eva = new EvalEVCIndi();

		String sql = BUSCAR_EVALExCINDI_DUPLICADOS;

		// &RegistroFecha) AND (evaluacion_360.periodo_evaluado=&RegistroPeriodo
		sql = sql.replaceAll("&id_idEvaluado", "" + idEvaluado);
		sql = sql.replaceAll("&id_periodo", "" + periodo);
		sql = sql.replaceAll("&id_Evaluador", "" + idEvaluador);

		Util.print("\nidEvaluado: " + idEvaluado);
		Util.print("Periodo: " + periodo);
		Util.print("idEvaluador: " + idEvaluador);

		Util.print("\nEvalEVCIndiPeer - > buscarEvalEvcIndiDuplicados() -> SQL: " + sql);

		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				if (rs.next()) {
					eva.setIdEvalEVCIndi(rs.getInt("id_eval_evc_indiv"));
					/*eva.setResultadoIndi(rs.getFloat("resultado_ind"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setFechaDesarrollo(rs.getDate("fecha_desarrollo"));
					eva.setTipoEvaluador(new TipoEvaluador(rs
							.getInt("id_t_evaluador")));
					eva.setEvaluacion360(new Evaluacion360(rs
							.getInt("id_evaluacion_360")));
					eva.setEvaluador(new Funcionario(rs.getInt("evaluador")));*/
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("\nEvalEVCIndiPeer - > buscarEvalEvcIndiDuplicados():"
					+ e.getMessage());
		}
		return eva;
	}


	
	
		/**
		 *  Inserta un Tipo de Eval_EVC_Indiv en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param Eval_EVC_Indiv	Eval_EVC_Indiv que se va a insertar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al insertar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	public static int insertarEvalEVCIndi(Statement stmt, EvalEVCIndi evalEVCIndi) throws SQLException {
		int idNuevaEvalEVCIndi = -1;
		ResultSet rs = null;
		
		try {
			String sql = INSERTAR_EVALEVCINDI;
			 //se setean los "parametros": &id_calificacion, &cualitativa, &cuantitativa, &descripcion 
			sql = sql.replaceAll("&resultado_ind", ""+evalEVCIndi.getResultadoIndi())
					 .replaceAll("&observacion", ""+evalEVCIndi.getObservacion())
					 .replaceAll("&estado", ""+ evalEVCIndi.getEstado())
					 .replaceAll("&fecha_desarrollo", "" + evalEVCIndi.getFechaDesarrollo())
					 .replaceAll("&evaluacion_evc", ""+evalEVCIndi.getEvaluacionEVC().getIdEvaluacionEVC())
					 .replaceAll("&evaluador", ""+ evalEVCIndi.getEvaluador().getIdFuncionario());
			
			stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
			
			rs = stmt.getGeneratedKeys();
			if (rs.next()) {
				idNuevaEvalEVCIndi = rs.getInt("id_eval_EVC_indiv");
				Util.print("nuevo registro: " + idNuevaEvalEVCIndi);
			}
		}catch (Exception e) {
			Util.print(" > " + e.getMessage());
		
		} finally {
			rs.close();
		}
		
		return idNuevaEvalEVCIndi;
	}

	
	
		/**
		 *  Actualiza un Eval_EVC_Indiv en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param Eval_EVC_Indiv	Eval_EVC_Indiv que se va a actualizar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al actualizar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void actualizarEvalEVCIndi(Statement stmt, EvalEVCIndi evalEVCIndi) throws SQLException {
		String sql = ACTUALIZAR_EVALEVCINDI;
		// se setean los "parametros": &id_eval_EVC_indiv, &resultado_Ind,'&pregunta_EVC',&evaluador, &evaluacion_EVC, '&observacion', '&fecha_desarrollo', '&estado'
		sql = sql.replaceAll("&id_eval_EVC_indiv", ""+ evalEVCIndi.getIdEvalEVCIndi())
				 .replaceAll("&resultado_ind", ""+evalEVCIndi.getResultadoIndi())
				 .replaceAll("&observacion", ""+evalEVCIndi.getObservacion())
				 .replaceAll("&estado", ""+evalEVCIndi.getEstado())
				 .replaceAll("&fecha_desarrollo", "" + evalEVCIndi.getFechaDesarrollo())
				 .replaceAll("&evaluacion_evc", ""+evalEVCIndi.getEvaluacionEVC().getIdEvaluacionEVC())
				 .replaceAll("&evaluador", ""+ evalEVCIndi.getEvaluador().getIdFuncionario());
		
		stmt.executeUpdate(sql);
	}
	
		/**
		 *  Elimina un Eval_EVC_Indiv en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param Eval_EVC_Indiv	Eval_EVC_Indiv que se va a eliminar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al eliminar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	public static void eliminarEvalEvcIndi(Statement stmt, EvalEVCIndi evalEVCIndi) throws SQLException {
		String sql = ELIMINAR_EVALEVCINDI;
		// se setean los "parametros": &id_eval_360_indiv
		sql = sql.replaceAll("&id_eval_EVC_indiv", "" + evalEVCIndi.getIdEvalEVCIndi());
	
		stmt.executeUpdate(sql);
	}

}
